export const loadResourcesMixin = {
  data() {
    return {
      isLoading: false,
      form: {
        visitType: '0'
      },
      tableData: [],
    }
  },
  // ----初始化页面完成后再对dom节点进行相关操作
  mounted() {
    // 不需要初始化请求配置
    // ---- this.mixinData.disableMixinCreated 判断初始化的时候是否要请求数据
    this.mixinData && this.mixinData.disableMixinCreated !== true && this.loadResources()

  },

  //---- 组件使用的一些方法都在此处进行添加
  methods: {
    loadResources(obj = {
      // ----index 默认值 当 loadResources 不传值的时候会默认给一个obj = {index: 1,}的对象
      index: 1,
    }) {


      // 预留开始方法 hook
      // ----loadDataBefore 类似于created(实例被创建之后被调用) 使用混入时,混入的方法不能完全处理时就可以在外面写一个 lo......re方法 这里就会优先执行
      this.loadDataBefore && this.loadDataBefore()

      /**
       * checkMust 发送请求之前，自己校验，最后 要返回 truew
       */
      // console.log(this.checkMust());

      // ----判断是否有必传字段 但是必须得有返回值 否则默认返回undefined
      if (this.checkMust == undefined || this.checkMust() === true) {


        // ----判断是否有分页 有分页 就要考虑分页的东西
        let params = {}
        // 整合分页参数
        if (this.ipagination) {
          /**
           * 当 obj.index 为 undefined 时，说明传过来的对象是元素点击时的事件对象
           * 点击查询时，obj.index 应该默认为 1
           */
          params.index = obj.index || 1;
          params.pageSize = obj.pageSize || this.ipagination.pageSize;
        }
        


        // -----判断是否会排序表格是否多选
        obj.sort && (params.sort = obj.sort)
        // 清空多选值
        this.selectedRows && (this.selectedRows = []);


        // 整合请求参数
        // ----合并对象 并不污染原form对象
        params = Object.assign(params, this.form)
		    console.log(params)

        Object.keys(params).forEach(key => {
        //   params[key].length == 0 && delete params[key]
        if(!params[key] && params[key]!==0){
          delete params[key]
        } 
        })

        // ----判断是否有tableAxios字段 有就进行请求发送操作 并对表格进行清空操作 且开启loading
        if (this.mixinData && this.mixinData.tableAxios) {

          let obj = this.mixinData.objName ? this[this.mixinData.objName] : this
          obj.tableData = []

          this.isLoading = true

          // 发起请求
          // ----在code=200的时候请求成功(成功之后对分页进行操作,并且走tableThen方法,这里是如果数据请求到之后，还有别的操作，否则在外面自定义tableThe方法，覆盖此处方法) 否则失败(失败对分页数据进行操作)  ----loadDataAfter预留的方法 类似于destroyed(组件卸载之前执行的函数)
          // this.mixinData.tableAxios(params).then(res => {
          console.log(params,"确认页面参数")
          this.apiB[this.mixinData.tableAxios](params).then(res => {
              if (res.code == 200) {
                // 更新分页参数
                this.ipagination && this.updateIpagination(res)
                // 抽离请求后的数据操作，方便进行方法重写
                this.tableThen(res);
                // 增加结束方法 hook
                this.loadDataAfter && this.loadDataAfter(res)
              } else this.$Message.info(res.msg);
            })
            .catch((err) => {
              // 报错分页参数 更新分页参数
              this.ipagination && this.updateIpagination({
                data: {
                  index: 1,
                  totalSize: 0
                }
              })
              // 报错时的 hook 
              this.errMethod && this.errMethod(err);
            })

            // ----请求结束的回调,取消loading
            .finally(() => {
              this.isLoading = false;
            });
        } else console.log('用this.mixinData.tableAxios接收导入的网络请求方法');
      }
    },

    // ----重置请求的筛选条件
    resetForm(formName = 'form') {
      this.$refs[formName] && this.$refs[formName].resetFields(); //此方法只能重置
      this.$set(this, ((typeof formName == 'string') && formName.constructor == String) ? formName : 'form', {
        visitType: '0'
      })
      // this.$set(this, ((typeof str == 'string') && str.constructor == String) ? formName : 'form', {})
    },

    // ----获取表格数据所在对象,默认this
    tableThen(res) {
      let obj = this.mixinData.objName ? this[this.mixinData.objName] : this

      /**
       * 后端数据不确定性，使用 this.mixinData.listByte ，如果没有定义，默认拿 res.data.list
       * 如果都没有，自动获取数组进行赋值
       */

      // ----如果mixinData中有定义后台返回的表格数据所在字段,就取这个字段,默认res.data.list
      if (this.mixinData.listByte || res.data.list) this.$set(obj, 'tableData', res.data[this.mixinData.listByte || 'records']);

      // ----如果没有定义就循环res.data对象,取数据是数组的哪一个数据
      else {
        let keys = Object.keys(res.data);
        keys.some(key => {
          if (Array.isArray(res.data[key])) return this.$set(obj, 'tableData', res.data[key]);
        })
      }
    },
  }
}
